NOTEBOOK - Stéphane Srsa
PROJET 9
Produire une étude de marché avec Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import display, HTML
from tabulate import tabulate
# Pour palier aux avertissements à l'utilisation de Seaborn (entre autres)
import warnings
warnings.filterwarnings("ignore")
from mpl_toolkits.axes_grid1 import make_axes_locatable
import plotly.express as px
import geopandas as gpd
from cartopy import crs as ccrs
from descartes import PolygonPatch
import folium
import requests
from P9_FonctionsCopie import *
# Choix de l'année (de 2010 à 2019)
année = 2019
# Période de lissage de la croissance (Calcul taux de croissance population)
Debut_period = année - 4
# Chargement des données et réduction sur l'année choisie
DF_F = pd.read_csv('DF_VOLAILLE.csv')
#DF_F = DF_F.drop('%Croiss_Pop',axis=1)
if année < 2010 or année > 2019 or isinstance(année, float):
Tmessage('Année non disponible !')
else:
# Taux de croissance de la population de puis Debut_period
Pop_Evol = pd.read_csv('Pop_Evol_NP.csv')
TCCP = Pop_Evol.pivot(index='Pays', columns='Année', values='Pop(Million)')
TCCP['%Croiss_Pop'] = round((((TCCP[année] - TCCP[Debut_period]) / TCCP[Debut_period]) *100),2)
TCCP = TCCP.reset_index()
# Mise en conformité des Pays
Concordance_pays = {"Royaume-Uni de Grande-Bretagne et d'Irlande du Nord": 'Royaume-Uni', 'Tchéquie':'République Tchèque'}
TCCP['Pays'] = TCCP['Pays'].replace(Concordance_pays)
DF_F = DF_F.reset_index()
DF_F = pd.merge(DF_F,TCCP[['Pays','%Croiss_Pop']], on='Pays', how='left')
DF_F['Pays'] = DF_F['Pays'].replace({'Pays-Bas (Royaume des)':'Pays-Bas'})
# Réduction des tables à l'année choisie
DF_F = DF_F.loc[DF_F['Année'] == année]
DF_F = DF_F.set_index('Pays')
DF_F = DF_F.drop(columns=['Année','index'])
infos_DF(DF_F)
| Disponibilité alimentaire (Kcal) | Disponibilité alimentaire (Kcal/personne/jour) | Disponibilité alimentaire en quantité (kg/personne/an) | Disponibilité de matière grasse en quantité (g/personne/jour) | Disponibilité de matière grasse en quantité (t) | Disponibilité de protéines en quantité (g/personne/jour) | Disponibilité de protéines en quantité (t) | Disponibilité intérieure / Milliers de tonnes | Exportations - Quantité / Milliers de tonnes | Importations - Quantité / Milliers de tonnes | ... | Pop(Million) | PIB / Croissance annuelle US$ par habitant % | PIB / Croissance annuelle US$ % | PIB / Valeur US $ par habitant USD | PIB / Valeur US $ Millions d’USD | Indice Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays | |||||||||||||||||||||
| Afghanistan | 94490.39 | 6.85 | 1.81 | 0.40 | 5471.99 | 0.82 | 11286.68 | 69.0 | 6.0 | 44.0 | ... | 37.769499 | -0.305564 | 2.636658 | 500.522664 | 18904.49026 | -2.652407 | 10.0 | 56.3 | 0.18 | 11.90 |
| Afrique du Sud | 2996329.90 | 141.32 | 37.50 | 8.16 | 173077.05 | 16.94 | 359134.38 | 2178.0 | 49.0 | 488.0 | ... | 58.087055 | -5.053596 | -3.815973 | 6688.774747 | 388531.22660 | -0.283250 | 36.0 | 79.7 | 0.45 | 3.96 |
| Albanie | 49226.46 | 46.93 | 12.34 | 2.67 | 2801.40 | 5.65 | 5931.04 | 35.0 | 0.0 | 22.0 | ... | 2.873883 | 1.729697 | 1.619022 | 5359.239078 | 15401.82608 | 0.110050 | 60.0 | 113.0 | 0.53 | -0.30 |
3 rows × 26 columns
<class 'pandas.core.frame.DataFrame'> Index: 182 entries, Afghanistan to Îles Salomon Data columns (total 26 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Disponibilité alimentaire (Kcal) 182 non-null float64 1 Disponibilité alimentaire (Kcal/personne/jour) 182 non-null float64 2 Disponibilité alimentaire en quantité (kg/personne/an) 182 non-null float64 3 Disponibilité de matière grasse en quantité (g/personne/jour) 182 non-null float64 4 Disponibilité de matière grasse en quantité (t) 182 non-null float64 5 Disponibilité de protéines en quantité (g/personne/jour) 182 non-null float64 6 Disponibilité de protéines en quantité (t) 182 non-null float64 7 Disponibilité intérieure / Milliers de tonnes 182 non-null float64 8 Exportations - Quantité / Milliers de tonnes 182 non-null float64 9 Importations - Quantité / Milliers de tonnes 182 non-null float64 10 Nourriture / Milliers de tonnes 182 non-null float64 11 Production / Milliers de tonnes 182 non-null float64 12 Résidus / Milliers de tonnes 182 non-null float64 13 %import 182 non-null float64 14 %export 182 non-null float64 15 %prod 182 non-null float64 16 Pop(Million) 182 non-null float64 17 PIB / Croissance annuelle US$ par habitant % 182 non-null float64 18 PIB / Croissance annuelle US$ % 182 non-null float64 19 PIB / Valeur US $ par habitant USD 182 non-null float64 20 PIB / Valeur US $ Millions d’USD 182 non-null float64 21 Indice Stabilité politique 182 non-null float64 22 Moy_Prot_Animale 182 non-null float64 23 Moy_Prot 182 non-null float64 24 %Prot_animale 182 non-null float64 25 %Croiss_Pop 182 non-null float64 dtypes: float64(26) memory usage: 38.4+ KB
Disponibilité alimentaire (Kcal) 0 Disponibilité alimentaire (Kcal/personne/jour) 0 Disponibilité alimentaire en quantité (kg/personne/an) 0 Disponibilité de matière grasse en quantité (g/personne/jour) 0 Disponibilité de matière grasse en quantité (t) 0 Disponibilité de protéines en quantité (g/personne/jour) 0 Disponibilité de protéines en quantité (t) 0 Disponibilité intérieure / Milliers de tonnes 0 Exportations - Quantité / Milliers de tonnes 0 Importations - Quantité / Milliers de tonnes 0 Nourriture / Milliers de tonnes 0 Production / Milliers de tonnes 0 Résidus / Milliers de tonnes 0 %import 0 %export 0 %prod 0 Pop(Million) 0 PIB / Croissance annuelle US$ par habitant % 0 PIB / Croissance annuelle US$ % 0 PIB / Valeur US $ par habitant USD 0 PIB / Valeur US $ Millions d’USD 0 Indice Stabilité politique 0 Moy_Prot_Animale 0 Moy_Prot 0 %Prot_animale 0 %Croiss_Pop 0 dtype: int64
Disponibilité alimentaire (Kcal) 182 Disponibilité alimentaire (Kcal/personne/jour) 182 Disponibilité alimentaire en quantité (kg/personne/an) 181 Disponibilité de matière grasse en quantité (g/personne/jour) 169 Disponibilité de matière grasse en quantité (t) 182 Disponibilité de protéines en quantité (g/personne/jour) 175 Disponibilité de protéines en quantité (t) 182 Disponibilité intérieure / Milliers de tonnes 136 Exportations - Quantité / Milliers de tonnes 62 Importations - Quantité / Milliers de tonnes 93 Nourriture / Milliers de tonnes 137 Production / Milliers de tonnes 126 Résidus / Milliers de tonnes 5 %import 143 %export 94 %prod 153 Pop(Million) 182 PIB / Croissance annuelle US$ par habitant % 182 PIB / Croissance annuelle US$ % 182 PIB / Valeur US $ par habitant USD 182 PIB / Valeur US $ Millions d’USD 182 Indice Stabilité politique 180 Moy_Prot_Animale 133 Moy_Prot 142 %Prot_animale 60 %Croiss_Pop 174 dtype: int64
#Verif_col(DF_F)
# Suppression des colonnes non suffisamment renseignées
DF_F = DF_F.drop(columns=['Résidus / Milliers de tonnes','Exportations - Quantité / Milliers de tonnes','%export'], axis=1)
#--------- Vérification des valeurs = 0 -----------------
# Préparation des données
Prod = DF_F.loc[DF_F['%import'] == 0]['%prod']
Prod = Prod.reset_index()
Imp = DF_F.loc[DF_F['%prod'] == 0]['%import']
Imp = Imp.reset_index()
# Création des sous-graphiques
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
# Sous-graphique 1 : Les pays qui n'importent pas
ax1.axis('off') # Supprime les axes
message1 = "Les pays avec %import = 0"
ax1.text(0.5, 2.8, message1, ha='center', fontsize=14, fontweight='bold', color = 'teal')
table1 = ax1.table(cellText=Prod.values, colLabels=Prod.columns, loc='top',
cellLoc='center', cellColours=[['lightgray', 'whitesmoke']]*len(Prod),
bbox=[0, 0.7, 1, 2])
table1.auto_set_font_size(False) # Désactive la taille de police automatique
table1.set_fontsize(11) # Définit la taille de police
ax1.text(1.1, 0.5, "Vérification terminée : tout est cohérent", ha='center', fontsize=14, fontweight='bold', color = 'firebrick')
# Sous-graphique 2 : Les pays qui importent
ax2.axis('off') # Supprime les axes
message2 = "Les pays avec %prod = 0"
ax2.text(0.5, 2.8, message2, ha='center', fontsize=14, fontweight='bold', color = 'teal')
table2 = ax2.table(cellText=Imp.values, colLabels=Imp.columns, loc='top',
cellLoc='center', cellColours=[['lightgray', 'whitesmoke']]*len(Imp),
bbox=[0, 0.7, 1, 2])
table2.auto_set_font_size(False) # Désactive la taille de police automatique
table2.set_fontsize(11) # Définit la taille de police
plt.tight_layout()
plt.show()
# Trier l'index par ordre décroissant
DF_F = DF_F.sort_index(ascending=True)
# Liste des colonnes
colonnes = DF_F.columns
# Liste des colonnes à supprimer
colonnes_a_supprimer = []
# Boucle pour calculer la corrélation entre chaque paire de colonnes
for i in range(len(colonnes)):
for j in range(i+1, len(colonnes)):
col1 = colonnes[i]
col2 = colonnes[j]
correlation = DF_F[col1].corr(DF_F[col2])
if correlation >= 0.985:
# Ajouter la colonne à la liste des colonnes à supprimer
colonnes_a_supprimer.append(col2)
# Supprimer les colonnes trop fortement corrélées (indicateurs similaires)
DF_F = DF_F.drop(columns=colonnes_a_supprimer, axis=1)
# Affichage
DF_F.head(1)
| Disponibilité alimentaire (Kcal) | Disponibilité alimentaire (Kcal/personne/jour) | Importations - Quantité / Milliers de tonnes | %import | %prod | Pop(Million) | PIB / Croissance annuelle US$ par habitant % | PIB / Valeur US $ par habitant USD | PIB / Valeur US $ Millions d’USD | Indice Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays | ||||||||||||||
| Afghanistan | 94490.39 | 6.85 | 44.0 | 63.77 | 40.58 | 37.769499 | -0.305564 | 500.522664 | 18904.49026 | -2.652407 | 10.0 | 56.3 | 0.18 | 11.9 |
# Calculate pairwise-correlation
matrix = DF_F.corr(method='pearson')
# Triangle de corrélations
mask1 = np.tril(np.ones_like(matrix, dtype=bool))
mask2 = np.eye(matrix.shape[0], dtype=bool)
mask = mask1 | mask2
# affichage
message = "corrélation entre les indicateurs"
Tmessage(message)
plt.figure(figsize=(12, 5))
sns.heatmap(matrix, mask=~mask, annot=True, cmap='seismic')
plt.show()
message = "Le dataset contient {:.0f} indicateurs pour {} Pays ".format(DF_F.shape[1],DF_F.shape[0])
Text_message(message)
#DF_F.corr(method='pearson')
# On Renomme les colonnes
variable = DF_F.columns
New_name = ['Dispo Alim','Dispo Alim (p/j)','Importation Qté', 'TDI','TAS', 'Pop(Million)', 'PiB croiss.Hab %',
'PIB Valeur Hab', 'PIB Valeur', 'Stabilité politique']
#New_name = ['Dispo Alim(Kcal)','Dispo Alim (p/j)','Importation Qté','Production', 'TDI','TAS', 'Pop(Million)', '%Croiss_Pop',
# 'PiB croiss.Hab %', 'PiB croiss %', 'PIB Valeur Hab', 'PIB Valeur', 'Stabilité politique']
# Dictionnaire de correspondance entre les anciens noms et les nouveaux noms
column_mapping = {ancien: nouveau for ancien, nouveau in zip(variable, New_name)}
# On renomme les colonnes
DF_F = DF_F.rename(columns=column_mapping)
DF_F.head(2)
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays | ||||||||||||||
| Afghanistan | 94490.39 | 6.85 | 44.0 | 63.77 | 40.58 | 37.769499 | -0.305564 | 500.522664 | 18904.49026 | -2.652407 | 10.0 | 56.3 | 0.18 | 11.90 |
| Afrique du Sud | 2996329.90 | 141.32 | 488.0 | 22.41 | 83.38 | 58.087055 | -5.053596 | 6688.774747 | 388531.22660 | -0.283250 | 36.0 | 79.7 | 0.45 | 3.96 |
Le but est de trouver un prétraitement permettant d'obtenir des groupes homogènes et de minimiser l'impact des outliers. Pour cela et malgré le nombre de clusters conseillés, j'ai choisi d'imposer 5 clusters.¶
StandardScaler
# CAH(DF, scaler)
#CAH(DF_F, preprocessing.StandardScaler())
print('-------------------------------------------------------------------------------------------------------------------------')
# Kmeans(DF, scaler)
Kmeans(DF_F, preprocessing.StandardScaler())
-------------------------------------------------------------------------------------------------------------------------
# CAH_groupes(DF, scaler, nombre de clusters, Seuil_Outliers)
CAH_groupes(DF_F, preprocessing.StandardScaler(), 5, 6)
print('-----------------------------------------------------------------------------------------------------------------------')
# Kmeans_Centroides(DF, scaler, nombre de clusters, Seuil_Outliers)
Kmeans_Centroides(DF_F, preprocessing.StandardScaler(), 5, 6)
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays | ||||||||||||||
| Chine, continentale | 33788758.93 | 65.11 | 795.0 | 3.83 | 100.11 | 1421.864031 | 2.424684 | 10043.130179 | 1.427997e+07 | -0.259811 | 40.7 | 105.3 | 0.39 | 2.02 |
| Inde | 6054757.47 | 11.99 | 0.0 | 0.00 | 100.11 | 1383.112050 | 2.115564 | 2061.100834 | 2.850733e+06 | -0.796841 | 15.3 | 65.7 | 0.23 | 4.55 |
| Pays-Bas | 126988.92 | 20.04 | 602.0 | 373.91 | 650.93 | 17.363262 | -0.863965 | 52420.699958 | 9.101943e+05 | 0.821221 | 67.3 | 107.3 | 0.63 | 1.89 |
| Yémen | 454767.27 | 39.50 | 140.0 | 42.42 | 57.58 | 31.546691 | -52.499717 | 411.460367 | 1.298021e+04 | -2.770874 | 10.7 | 53.0 | 0.20 | 10.63 |
| États-Unis d'Amérique | 25967507.67 | 212.80 | 123.0 | 0.64 | 119.00 | 334.319671 | 3.450642 | 63953.688205 | 2.138098e+07 | 0.117877 | 75.3 | 116.3 | 0.65 | 2.99 |
-----------------------------------------------------------------------------------------------------------------------
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays | ||||||||||||||
| Chine, continentale | 33788758.93 | 65.11 | 795.0 | 3.83 | 100.11 | 1421.864031 | 2.424684 | 10043.130179 | 1.427997e+07 | -0.259811 | 40.7 | 105.3 | 0.39 | 2.02 |
| Inde | 6054757.47 | 11.99 | 0.0 | 0.00 | 100.11 | 1383.112050 | 2.115564 | 2061.100834 | 2.850733e+06 | -0.796841 | 15.3 | 65.7 | 0.23 | 4.55 |
| Pays-Bas | 126988.92 | 20.04 | 602.0 | 373.91 | 650.93 | 17.363262 | -0.863965 | 52420.699958 | 9.101943e+05 | 0.821221 | 67.3 | 107.3 | 0.63 | 1.89 |
| Yémen | 454767.27 | 39.50 | 140.0 | 42.42 | 57.58 | 31.546691 | -52.499717 | 411.460367 | 1.298021e+04 | -2.770874 | 10.7 | 53.0 | 0.20 | 10.63 |
| États-Unis d'Amérique | 25967507.67 | 212.80 | 123.0 | 0.64 | 119.00 | 334.319671 | 3.450642 | 63953.688205 | 2.138098e+07 | 0.117877 | 75.3 | 116.3 | 0.65 | 2.99 |
# CAH_Stats(DF, scaler, Nombre de clusters)
# Affichage et Enregistrement des résultats CAH
Data_Scaler_CAH = CAH_Stats(DF_F, preprocessing.StandardScaler(), 5)
print('-----------------------------------------------------------------------------------------------------------------------')
# Kmeans_Stats(DF, scaler, Nombre de clusters)
# Affichage et Enregistrement des résultats Kmeans
Data_Scaler_Kmeans = Kmeans_Stats(DF_F, preprocessing.StandardScaler(), 5)
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | cluster | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cluster | |||||||||||||||
| 1 | -0.139243 | -0.712892 | -0.291384 | -0.269454 | 0.005114 | 0.049695 | 0.003989 | -0.598599 | -0.176023 | -0.659829 | -0.836334 | -0.665342 | -0.868800 | 0.512164 | 1.0 |
| 2 | 8.471785 | 0.807409 | 1.902109 | -0.867561 | 0.573956 | 5.526791 | 0.387881 | 1.135431 | 8.753408 | 0.048381 | 0.996774 | 1.384290 | 0.547093 | -0.548553 | 2.0 |
| 3 | -0.096923 | 0.669807 | -0.159426 | 0.219474 | -0.164544 | -0.187773 | 0.071099 | 0.031906 | -0.137850 | 0.513949 | 0.535616 | 0.350194 | 0.690818 | -0.531064 | 3.0 |
| 4 | 0.088166 | 0.540038 | 1.288705 | 0.091606 | 0.027238 | -0.077434 | -0.263684 | 1.931726 | 0.305344 | 0.804720 | 1.287831 | 1.204410 | 0.977321 | -0.176411 | 4.0 |
| 5 | -0.254164 | -0.996172 | 2.642471 | 6.949159 | 9.473546 | -0.164791 | -0.098098 | 1.914996 | 0.219544 | 0.989753 | 1.445960 | 1.220299 | 1.227391 | -0.673840 | 5.0 |
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | cluster | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays | |||||||||||||||
| Afghanistan | -0.263696 | -1.196225 | -0.246493 | 0.426585 | -0.559915 | -0.029854 | -0.026715 | -0.709459 | -0.229984 | -2.675368 | -1.321602 | -1.169274 | -1.555647 | 1.365387 | 1 |
| Afrique du Sud | 0.587408 | 0.843279 | 2.052252 | -0.443260 | 0.143668 | 0.104496 | -0.633677 | -0.396656 | -0.043560 | -0.175605 | -0.065815 | -0.072882 | 0.114176 | -0.252141 | 4 |
| Albanie | -0.276972 | -0.588332 | -0.360395 | 0.407447 | -0.616465 | -0.260602 | 0.233461 | -0.463861 | -0.231751 | 0.239376 | 1.093373 | 1.487369 | 0.608938 | -1.119984 | 3 |
Index(['Afghanistan', 'Algérie', 'Angola', 'Azerbaïdjan', 'Bangladesh',
'Belize', 'Bhoutan', 'Bolivie (État plurinational de)', 'Botswana',
'Burkina Faso', 'Burundi', 'Bénin', 'Cabo Verde', 'Cambodge',
'Cameroun', 'Comores', 'Côte d'Ivoire', 'Eswatini', 'Gambie', 'Ghana',
'Guatemala', 'Guinée', 'Guinée-Bissau', 'Haïti', 'Honduras', 'Inde',
'Indonésie', 'Iran (République islamique d')', 'Iraq', 'Jordanie',
'Kenya', 'Kirghizistan', 'Lesotho', 'Liban', 'Libye', 'Libéria',
'Madagascar', 'Malawi', 'Mali', 'Maroc', 'Mauritanie', 'Mozambique',
'Myanmar', 'Namibie', 'Nicaragua', 'Niger', 'Nigéria', 'Népal',
'Ouganda', 'Ouzbékistan', 'Pakistan', 'Paraguay', 'Philippines',
'Rwanda', 'République arabe syrienne', 'République centrafricaine',
'République dominicaine', 'République démocratique du Congo',
'République démocratique populaire lao', 'République-Unie de Tanzanie',
'Sao Tomé-et-Principe', 'Sierra Leone', 'Soudan', 'Soudan du Sud',
'Sri Lanka', 'Sénégal', 'Tadjikistan', 'Tchad', 'Thaïlande',
'Timor-Leste', 'Togo', 'Tunisie', 'Turkménistan', 'Turquie', 'Ukraine',
'Vanuatu', 'Venezuela (République bolivarienne du)', 'Viet Nam',
'Yémen', 'Zambie', 'Zimbabwe', 'Égypte', 'Équateur', 'Éthiopie',
'Îles Salomon'],
dtype='object', name='Pays')
Index(['Chine, continentale', 'États-Unis d'Amérique'], dtype='object', name='Pays')
Index(['Albanie', 'Antigua-et-Barbuda', 'Argentine', 'Arménie', 'Bahamas',
'Bahreïn', 'Barbade', 'Belgique', 'Bosnie-Herzégovine', 'Brésil',
'Bulgarie', 'Bélarus', 'Chili', 'Chine, Taiwan Province de', 'Chypre',
'Colombie', 'Congo', 'Costa Rica', 'Croatie', 'Cuba', 'Dominique',
'El Salvador', 'Espagne', 'Estonie', 'Fidji', 'Fédération de Russie',
'Gabon', 'Grenade', 'Grèce', 'Guyana', 'Géorgie', 'Hongrie', 'Italie',
'Jamaïque', 'Kazakhstan', 'Kiribati', 'Koweït', 'Lettonie', 'Lituanie',
'Macédoine du Nord', 'Malaisie', 'Malte', 'Maurice',
'Micronésie (États fédérés de)', 'Mongolie', 'Monténégro', 'Nauru',
'Nouvelle-Calédonie', 'Oman', 'Panama', 'Papouasie-Nouvelle-Guinée',
'Pologne', 'Polynésie française', 'Portugal', 'Pérou', 'Qatar',
'Roumanie', 'République Tchèque', 'République de Corée',
'République de Moldova', 'Saint-Kitts-et-Nevis',
'Saint-Vincent-et-les Grenadines', 'Sainte-Lucie', 'Samoa', 'Serbie',
'Seychelles', 'Slovaquie', 'Slovénie', 'Suriname', 'Trinité-et-Tobago',
'Uruguay'],
dtype='object', name='Pays')
Index(['Afrique du Sud', 'Allemagne', 'Arabie saoudite', 'Australie',
'Autriche', 'Canada', 'Chine - RAS de Hong-Kong',
'Chine - RAS de Macao', 'Danemark', 'Finlande', 'France', 'Irlande',
'Islande', 'Israël', 'Japon', 'Luxembourg', 'Mexique', 'Norvège',
'Nouvelle-Zélande', 'Royaume-Uni', 'Suisse', 'Suède',
'Émirats arabes unis'],
dtype='object', name='Pays')
Index(['Pays-Bas'], dtype='object', name='Pays') -----------------------------------------------------------------------------------------------------------------------
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | cluster | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cluster | |||||||||||||||
| 0 | 0.011035 | 0.504944 | -0.119795 | -0.285174 | 0.303206 | -0.139285 | -0.021159 | 0.700336 | -0.047821 | 0.591185 | 0.984563 | 0.933692 | 0.832982 | -0.561102 | 0.0 |
| 1 | -0.132303 | -0.739912 | -0.279018 | -0.360152 | 0.049937 | 0.074563 | -0.029774 | -0.602441 | -0.170236 | -0.781892 | -0.870187 | -0.688897 | -0.913407 | 0.559757 | 1.0 |
| 2 | 0.319160 | 0.353401 | 3.423734 | 1.295820 | 1.071330 | 0.081843 | -0.108930 | 1.276644 | 0.713534 | 0.399536 | 1.033965 | 0.959789 | 0.837766 | -0.533274 | 2.0 |
| 3 | 8.471785 | 0.807409 | 1.902109 | -0.867561 | 0.573956 | 5.526791 | 0.387881 | 1.135431 | 8.753408 | 0.048381 | 0.996774 | 1.384290 | 0.547093 | -0.548553 | 3.0 |
| 4 | -0.266677 | 0.661598 | -0.254591 | 0.820076 | -0.816058 | -0.264253 | 0.096343 | -0.132427 | -0.226391 | 0.655452 | 0.086143 | -0.208159 | 0.451946 | -0.192123 | 4.0 |
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | cluster | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays | |||||||||||||||
| Afghanistan | -0.263696 | -1.196225 | -0.246493 | 0.426585 | -0.559915 | -0.029854 | -0.026715 | -0.709459 | -0.229984 | -2.675368 | -1.321602 | -1.169274 | -1.555647 | 1.365387 | 1 |
| Afrique du Sud | 0.587408 | 0.843279 | 2.052252 | -0.443260 | 0.143668 | 0.104496 | -0.633677 | -0.396656 | -0.043560 | -0.175605 | -0.065815 | -0.072882 | 0.114176 | -0.252141 | 0 |
| Albanie | -0.276972 | -0.588332 | -0.360395 | 0.407447 | -0.616465 | -0.260602 | 0.233461 | -0.463861 | -0.231751 | 0.239376 | 1.093373 | 1.487369 | 0.608938 | -1.119984 | 0 |
Index(['Afrique du Sud', 'Albanie', 'Argentine', 'Australie', 'Autriche',
'Barbade', 'Bosnie-Herzégovine', 'Brésil', 'Bélarus', 'Canada', 'Chili',
'Chine - RAS de Macao', 'Chine, Taiwan Province de', 'Chypre',
'Costa Rica', 'Croatie', 'Danemark', 'Espagne', 'Estonie', 'Finlande',
'Fédération de Russie', 'Grèce', 'Guyana', 'Hongrie', 'Irlande',
'Islande', 'Israël', 'Italie', 'Kazakhstan', 'Lettonie', 'Lituanie',
'Luxembourg', 'Malaisie', 'Malte', 'Maurice', 'Monténégro', 'Myanmar',
'Norvège', 'Nouvelle-Zélande', 'Panama', 'Pologne', 'Portugal', 'Pérou',
'Roumanie', 'République Tchèque', 'République de Corée', 'Serbie',
'Slovénie', 'Suisse', 'Suède', 'Trinité-et-Tobago', 'Ukraine',
'Uruguay'],
dtype='object', name='Pays')
Index(['Afghanistan', 'Algérie', 'Angola', 'Azerbaïdjan', 'Bangladesh',
'Belize', 'Bolivie (État plurinational de)', 'Burkina Faso', 'Burundi',
'Bénin', 'Cambodge', 'Cameroun', 'Colombie', 'Comores', 'Côte d'Ivoire',
'El Salvador', 'Eswatini', 'Gambie', 'Ghana', 'Guatemala', 'Guinée',
'Guinée-Bissau', 'Haïti', 'Honduras', 'Inde', 'Indonésie',
'Iran (République islamique d')', 'Iraq', 'Jordanie', 'Kenya',
'Lesotho', 'Liban', 'Libye', 'Libéria', 'Madagascar', 'Malawi', 'Mali',
'Maroc', 'Mauritanie', 'Mozambique', 'Nicaragua', 'Niger', 'Nigéria',
'Népal', 'Ouganda', 'Ouzbékistan', 'Pakistan',
'Papouasie-Nouvelle-Guinée', 'Paraguay', 'Philippines', 'Rwanda',
'République arabe syrienne', 'République centrafricaine',
'République démocratique du Congo',
'République démocratique populaire lao', 'République-Unie de Tanzanie',
'Sierra Leone', 'Soudan', 'Soudan du Sud', 'Sri Lanka', 'Sénégal',
'Tadjikistan', 'Tchad', 'Thaïlande', 'Timor-Leste', 'Togo', 'Tunisie',
'Turkménistan', 'Turquie', 'Venezuela (République bolivarienne du)',
'Viet Nam', 'Yémen', 'Zambie', 'Zimbabwe', 'Égypte', 'Équateur',
'Éthiopie', 'Îles Salomon'],
dtype='object', name='Pays')
Index(['Allemagne', 'Arabie saoudite', 'Belgique', 'Chine - RAS de Hong-Kong',
'France', 'Japon', 'Mexique', 'Pays-Bas', 'Royaume-Uni',
'Émirats arabes unis'],
dtype='object', name='Pays')
Index(['Chine, continentale', 'États-Unis d'Amérique'], dtype='object', name='Pays')
Index(['Antigua-et-Barbuda', 'Arménie', 'Bahamas', 'Bahreïn', 'Bhoutan',
'Botswana', 'Bulgarie', 'Cabo Verde', 'Congo', 'Cuba', 'Dominique',
'Fidji', 'Gabon', 'Grenade', 'Géorgie', 'Jamaïque', 'Kirghizistan',
'Kiribati', 'Koweït', 'Macédoine du Nord',
'Micronésie (États fédérés de)', 'Mongolie', 'Namibie', 'Nauru',
'Nouvelle-Calédonie', 'Oman', 'Polynésie française', 'Qatar',
'République de Moldova', 'République dominicaine',
'Saint-Kitts-et-Nevis', 'Saint-Vincent-et-les Grenadines',
'Sainte-Lucie', 'Samoa', 'Sao Tomé-et-Principe', 'Seychelles',
'Slovaquie', 'Suriname', 'Vanuatu'],
dtype='object', name='Pays')
Transformation Logarithmique
# CAH(DF, scaler)
CAH(DF_F,'Log')
print('-----------------------------------------------------------------------------------------------------------------------')
# Kmeans(DF, scaler)
Kmeans(DF_F,'Log')
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays | ||||||||||||||
| Afghanistan | 11.456264 | 2.060514 | 3.806662 | 4.170843 | 3.727619 | 3.657634 | 0.095310 | 6.217649 | 9.847208 | 0.095310 | 2.397895 | 4.048301 | 0.165514 | 2.557227 |
| Afrique du Sud | 14.912899 | 4.958078 | 6.192362 | 3.153163 | 4.435330 | 4.079012 | 0.095310 | 8.808335 | 12.870131 | 0.095310 | 3.610918 | 4.390739 | 0.371564 | 1.601406 |
| Albanie | 10.804207 | 3.869742 | 3.135494 | 4.156693 | 3.641264 | 1.354257 | 1.004191 | 8.586764 | 9.642306 | 0.104405 | 4.110874 | 4.736198 | 0.425268 | 0.095310 |
-----------------------------------------------------------------------------------------------------------------------
# CAH_groupes(DF, scaler, ombre de clusters, Seuil_Outliers)
CAH_groupes(DF_F,'Log', 5, 3.2)
print('-----------------------------------------------------------------------------------------------------------------------')
# Kmeans_Centroides(DF, scaler, ombre de clusters, Seuil_Outliers)
Kmeans_Centroides(DF_F,'Log', 5, 3.2)
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays | ||||||||||||||
| Burundi | 9068.87 | 2.09 | 0.0 | 0.00 | 100.00 | 11.874838 | -1.717280 | 283.669870 | 3.368534e+03 | -1.624993 | 2.3 | 41.0 | 0.06 | 10.70 |
| Chine, continentale | 33788758.93 | 65.11 | 795.0 | 3.83 | 100.11 | 1421.864031 | 2.424684 | 10043.130179 | 1.427997e+07 | -0.259811 | 40.7 | 105.3 | 0.39 | 2.02 |
| Inde | 6054757.47 | 11.99 | 0.0 | 0.00 | 100.11 | 1383.112050 | 2.115564 | 2061.100834 | 2.850733e+06 | -0.796841 | 15.3 | 65.7 | 0.23 | 4.55 |
| République démocratique du Congo | 201159.58 | 6.13 | 136.0 | 91.89 | 6.76 | 89.906890 | -2.779337 | 526.318175 | 4.731963e+04 | -1.624439 | 3.0 | 29.7 | 0.10 | 14.30 |
-----------------------------------------------------------------------------------------------------------------------
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays | ||||||||||||||
| Burundi | 9068.87 | 2.09 | 0.0 | 0.00 | 100.00 | 11.874838 | -1.717280 | 283.669870 | 3.368534e+03 | -1.624993 | 2.3 | 41.0 | 0.06 | 10.70 |
| Chine, continentale | 33788758.93 | 65.11 | 795.0 | 3.83 | 100.11 | 1421.864031 | 2.424684 | 10043.130179 | 1.427997e+07 | -0.259811 | 40.7 | 105.3 | 0.39 | 2.02 |
| Inde | 6054757.47 | 11.99 | 0.0 | 0.00 | 100.11 | 1383.112050 | 2.115564 | 2061.100834 | 2.850733e+06 | -0.796841 | 15.3 | 65.7 | 0.23 | 4.55 |
| République démocratique du Congo | 201159.58 | 6.13 | 136.0 | 91.89 | 6.76 | 89.906890 | -2.779337 | 526.318175 | 4.731963e+04 | -1.624439 | 3.0 | 29.7 | 0.10 | 14.30 |
# CAH_Stats(DF, scaler, Nombre de clusters)
# Affichage et Enregistrement des résultats CAH
Data_Log_CAH = CAH_Stats(DF_F,'Log', 5)
print('-----------------------------------------------------------------------------------------------------------------------')
# Kmeans_Stats(DF, scaler, Nombre de clusters)
# Affichage et Enregistrement des résultats Kmeans
Data_Log_Kmeans = Kmeans_Stats(DF_F,'Log', 5)
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | cluster | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cluster | |||||||||||||||
| 1 | 9.284351 | 4.172110 | 2.031929 | 4.138021 | 2.203780 | 0.601399 | 0.623738 | 8.762388 | 8.016857 | 0.479380 | 3.548279 | 4.312279 | 0.395452 | 1.670357 | 1.0 |
| 2 | 11.468470 | 3.129018 | 3.791658 | 4.139268 | 3.456519 | 2.623110 | 0.944759 | 7.165539 | 9.665658 | 0.118936 | 2.775903 | 4.106537 | 0.234784 | 2.341675 | 2.0 |
| 3 | 12.047738 | 4.625705 | 3.735006 | 3.435467 | 4.227885 | 1.812270 | 0.780902 | 9.540302 | 10.954877 | 0.353228 | 3.805318 | 4.485396 | 0.410466 | 0.991415 | 3.0 |
| 4 | 14.808968 | 4.670219 | 5.386993 | 2.547573 | 4.572750 | 4.267737 | 0.782749 | 9.555824 | 13.804738 | 0.218931 | 3.876382 | 4.569735 | 0.406567 | 1.312912 | 4.0 |
| 5 | 12.533405 | 3.233776 | 0.792992 | 0.672868 | 4.629442 | 3.533641 | 0.844142 | 7.860345 | 11.344244 | 0.149956 | 3.081376 | 4.307756 | 0.269567 | 2.032052 | 5.0 |
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | cluster | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays | |||||||||||||||
| Afghanistan | 11.456264 | 2.060514 | 3.806662 | 4.170843 | 3.727619 | 3.657634 | 0.095310 | 6.217649 | 9.847208 | 0.095310 | 2.397895 | 4.048301 | 0.165514 | 2.557227 | 2 |
| Afrique du Sud | 14.912899 | 4.958078 | 6.192362 | 3.153163 | 4.435330 | 4.079012 | 0.095310 | 8.808335 | 12.870131 | 0.095310 | 3.610918 | 4.390739 | 0.371564 | 1.601406 | 4 |
| Albanie | 10.804207 | 3.869742 | 3.135494 | 4.156693 | 3.641264 | 1.354257 | 1.004191 | 8.586764 | 9.642306 | 0.104405 | 4.110874 | 4.736198 | 0.425268 | 0.095310 | 3 |
Index(['Antigua-et-Barbuda', 'Bahamas', 'Bhoutan', 'Botswana', 'Burundi',
'Cabo Verde', 'Chine - RAS de Macao', 'Comores', 'Congo', 'Dominique',
'Eswatini', 'Gabon', 'Grenade', 'Guinée-Bissau', 'Islande', 'Kiribati',
'Lesotho', 'Luxembourg', 'Macédoine du Nord', 'Malte',
'Micronésie (États fédérés de)', 'Mongolie', 'Monténégro', 'Nauru',
'Nouvelle-Calédonie', 'Polynésie française',
'République centrafricaine', 'Saint-Kitts-et-Nevis',
'Saint-Vincent-et-les Grenadines', 'Sainte-Lucie', 'Samoa',
'Sao Tomé-et-Principe', 'Seychelles', 'Vanuatu', 'Îles Salomon'],
dtype='object', name='Pays')
Index(['Afghanistan', 'Angola', 'Bénin', 'Gambie', 'Ghana', 'Guinée', 'Haïti',
'Iraq', 'Kirghizistan', 'Libéria', 'Mauritanie', 'Mozambique',
'Namibie', 'Ouzbékistan', 'Papouasie-Nouvelle-Guinée',
'République arabe syrienne', 'République démocratique du Congo',
'Sierra Leone', 'Tadjikistan', 'Timor-Leste', 'Togo', 'Turkménistan',
'Yémen', 'Zambie'],
dtype='object', name='Pays')
Index(['Albanie', 'Arménie', 'Autriche', 'Azerbaïdjan', 'Bahreïn', 'Barbade',
'Belgique', 'Belize', 'Bosnie-Herzégovine', 'Bulgarie', 'Bélarus',
'Chine - RAS de Hong-Kong', 'Chine, Taiwan Province de', 'Chypre',
'Costa Rica', 'Croatie', 'Cuba', 'Danemark', 'El Salvador', 'Estonie',
'Fidji', 'Finlande', 'Grèce', 'Guatemala', 'Guyana', 'Géorgie',
'Honduras', 'Hongrie', 'Irlande', 'Jamaïque', 'Jordanie', 'Koweït',
'Lettonie', 'Liban', 'Libye', 'Lituanie', 'Maurice', 'Nicaragua',
'Oman', 'Panama', 'Pays-Bas', 'Portugal', 'Qatar', 'Roumanie',
'République Tchèque', 'République de Moldova', 'République dominicaine',
'Serbie', 'Slovaquie', 'Slovénie', 'Suisse', 'Suriname', 'Suède',
'Trinité-et-Tobago', 'Uruguay',
'Venezuela (République bolivarienne du)', 'Émirats arabes unis'],
dtype='object', name='Pays')
Index(['Afrique du Sud', 'Allemagne', 'Arabie saoudite', 'Canada', 'Chili',
'Chine, continentale', 'Colombie', 'Espagne', 'France',
'Fédération de Russie', 'Italie', 'Japon', 'Kazakhstan', 'Malaisie',
'Mexique', 'Philippines', 'Pologne', 'Pérou', 'Royaume-Uni',
'République de Corée', 'Turquie', 'Ukraine', 'Viet Nam', 'Égypte',
'États-Unis d'Amérique'],
dtype='object', name='Pays')
Index(['Algérie', 'Argentine', 'Australie', 'Bangladesh',
'Bolivie (État plurinational de)', 'Brésil', 'Burkina Faso', 'Cambodge',
'Cameroun', 'Côte d'Ivoire', 'Inde', 'Indonésie',
'Iran (République islamique d')', 'Israël', 'Kenya', 'Madagascar',
'Malawi', 'Mali', 'Maroc', 'Myanmar', 'Niger', 'Nigéria', 'Norvège',
'Nouvelle-Zélande', 'Népal', 'Ouganda', 'Pakistan', 'Paraguay',
'Rwanda', 'République démocratique populaire lao',
'République-Unie de Tanzanie', 'Soudan', 'Soudan du Sud', 'Sri Lanka',
'Sénégal', 'Tchad', 'Thaïlande', 'Tunisie', 'Zimbabwe', 'Équateur',
'Éthiopie'],
dtype='object', name='Pays')
-----------------------------------------------------------------------------------------------------------------------
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | cluster | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cluster | |||||||||||||||
| 0 | 11.616754 | 4.665826 | 3.191040 | 3.371124 | 4.033830 | 1.459101 | 0.831929 | 9.410496 | 10.328334 | 0.335633 | 3.773720 | 4.474580 | 0.403276 | 1.149784 | 0.0 |
| 1 | 12.525204 | 3.190879 | 0.602488 | 0.430175 | 4.640607 | 3.562942 | 0.903228 | 7.677350 | 11.192972 | 0.114976 | 2.965763 | 4.259008 | 0.254062 | 2.019224 | 1.0 |
| 2 | 11.325661 | 2.871732 | 3.442934 | 3.909984 | 3.637848 | 2.735222 | 0.692754 | 7.009788 | 9.650434 | 0.121309 | 2.791817 | 4.115021 | 0.238832 | 2.389178 | 2.0 |
| 3 | 14.024303 | 4.605647 | 5.108406 | 3.039358 | 4.437731 | 3.581400 | 0.643124 | 9.806304 | 13.339747 | 0.324917 | 3.908578 | 4.568208 | 0.420407 | 1.186372 | 3.0 |
| 4 | 9.002758 | 4.180416 | 1.784126 | 4.115243 | 2.031409 | 0.459181 | 0.880316 | 8.589127 | 7.546227 | 0.476344 | 3.493819 | 4.278799 | 0.383259 | 1.623870 | 4.0 |
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | cluster | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays | |||||||||||||||
| Afghanistan | 11.456264 | 2.060514 | 3.806662 | 4.170843 | 3.727619 | 3.657634 | 0.095310 | 6.217649 | 9.847208 | 0.095310 | 2.397895 | 4.048301 | 0.165514 | 2.557227 | 2 |
| Afrique du Sud | 14.912899 | 4.958078 | 6.192362 | 3.153163 | 4.435330 | 4.079012 | 0.095310 | 8.808335 | 12.870131 | 0.095310 | 3.610918 | 4.390739 | 0.371564 | 1.601406 | 3 |
| Albanie | 10.804207 | 3.869742 | 3.135494 | 4.156693 | 3.641264 | 1.354257 | 1.004191 | 8.586764 | 9.642306 | 0.104405 | 4.110874 | 4.736198 | 0.425268 | 0.095310 | 0 |
Index(['Albanie', 'Arménie', 'Azerbaïdjan', 'Bahamas', 'Bahreïn', 'Barbade',
'Bosnie-Herzégovine', 'Bulgarie', 'Bélarus', 'Chine - RAS de Macao',
'Chine, Taiwan Province de', 'Chypre', 'Costa Rica', 'Croatie',
'El Salvador', 'Estonie', 'Fidji', 'Finlande', 'Gabon', 'Guyana',
'Géorgie', 'Honduras', 'Islande', 'Jamaïque', 'Jordanie', 'Koweït',
'Lettonie', 'Liban', 'Libye', 'Lituanie', 'Macédoine du Nord', 'Malte',
'Maurice', 'Nicaragua', 'Norvège', 'Oman', 'Panama', 'Qatar',
'République de Moldova', 'République dominicaine', 'Serbie',
'Slovaquie', 'Slovénie', 'Suriname', 'Trinité-et-Tobago',
'Turkménistan', 'Uruguay'],
dtype='object', name='Pays')
Index(['Algérie', 'Argentine', 'Bangladesh', 'Bolivie (État plurinational de)',
'Burkina Faso', 'Burundi', 'Cambodge', 'Cameroun', 'Côte d'Ivoire',
'Inde', 'Indonésie', 'Iran (République islamique d')', 'Israël',
'Kenya', 'Madagascar', 'Malawi', 'Mali', 'Maroc', 'Myanmar', 'Nigéria',
'Nouvelle-Zélande', 'Népal', 'Ouganda', 'Pakistan', 'Paraguay',
'Rwanda', 'Soudan', 'Soudan du Sud', 'Sri Lanka', 'Sénégal',
'Thaïlande', 'Tunisie', 'Zimbabwe', 'Équateur', 'Éthiopie'],
dtype='object', name='Pays')
Index(['Afghanistan', 'Angola', 'Bénin', 'Congo', 'Ghana', 'Guinée', 'Haïti',
'Kirghizistan', 'Libéria', 'Mauritanie', 'Mozambique', 'Namibie',
'Niger', 'Ouzbékistan', 'Papouasie-Nouvelle-Guinée',
'République arabe syrienne', 'République centrafricaine',
'République démocratique du Congo',
'République démocratique populaire lao', 'République-Unie de Tanzanie',
'Sierra Leone', 'Tadjikistan', 'Tchad', 'Togo', 'Yémen', 'Zambie'],
dtype='object', name='Pays')
Index(['Afrique du Sud', 'Allemagne', 'Arabie saoudite', 'Australie',
'Autriche', 'Belgique', 'Brésil', 'Canada', 'Chili',
'Chine - RAS de Hong-Kong', 'Chine, continentale', 'Colombie', 'Cuba',
'Danemark', 'Espagne', 'France', 'Fédération de Russie', 'Grèce',
'Guatemala', 'Hongrie', 'Iraq', 'Irlande', 'Italie', 'Japon',
'Kazakhstan', 'Malaisie', 'Mexique', 'Pays-Bas', 'Philippines',
'Pologne', 'Portugal', 'Pérou', 'Roumanie', 'Royaume-Uni',
'République Tchèque', 'République de Corée', 'Suisse', 'Suède',
'Turquie', 'Ukraine', 'Venezuela (République bolivarienne du)',
'Viet Nam', 'Égypte', 'Émirats arabes unis', 'États-Unis d'Amérique'],
dtype='object', name='Pays')
Index(['Antigua-et-Barbuda', 'Belize', 'Bhoutan', 'Botswana', 'Cabo Verde',
'Comores', 'Dominique', 'Eswatini', 'Gambie', 'Grenade',
'Guinée-Bissau', 'Kiribati', 'Lesotho', 'Luxembourg',
'Micronésie (États fédérés de)', 'Mongolie', 'Monténégro', 'Nauru',
'Nouvelle-Calédonie', 'Polynésie française', 'Saint-Kitts-et-Nevis',
'Saint-Vincent-et-les Grenadines', 'Sainte-Lucie', 'Samoa',
'Sao Tomé-et-Principe', 'Seychelles', 'Timor-Leste', 'Vanuatu',
'Îles Salomon'],
dtype='object', name='Pays')
MinMaxScaler()
CAH_groupes(DF, scaler, ombre de clusters, Seuil_Outliers)¶
CAH_groupes(DF_F, MinMaxScaler(), 5, 5) print('-----------------------------------------------------------------------------------------------------------------------')
Kmeans_Centroides(DF, scaler, ombre de clusters, Seuil_Outliers)¶
Kmeans_Centroides(DF_F, MinMaxScaler(), 5, 5)
CAH_Stats(DF, scaler, Nombre de clusters)¶
Affichage et Enregistrement des résultats CAH¶
Data_MinMax_CAH = CAH_Stats(DF_F, MinMaxScaler(), 5) print('-----------------------------------------------------------------------------------------------------------------------')
Kmeans_Stats(DF, scaler, Nombre de clusters)¶
Affichage et Enregistrement des résultats Kmeans¶
Data_MinMax_Kmeans = Kmeans_Stats(DF_F, MinMaxScaler(), 5)
PowerTransformer()
CAH_groupes(DF, scaler, ombre de clusters, Seuil_Outliers)¶
CAH_groupes(DF_F, PowerTransformer(method='yeo-johnson'), 5, 4) print('-----------------------------------------------------------------------------------------------------------------------')
Kmeans_Centroides(DF, scaler, ombre de clusters, Seuil_Outliers)¶
Kmeans_Centroides(DF_F, PowerTransformer(method='yeo-johnson'), 5, 4)
CAH_Stats(DF, scaler, Nombre de clusters)¶
Affichage et Enregistrement des résultats CAH¶
Data_Power_CAH = CAH_Stats(DF_F, PowerTransformer(method='yeo-johnson'), 5) print('-----------------------------------------------------------------------------------------------------------------------')
Kmeans_Stats(DF, scaler, Nombre de clusters)¶
Affichage et enregistrement des résultats Kmeans¶
Data_Power_Kmeans = Kmeans_Stats(DF_F, PowerTransformer(method='yeo-johnson'), 5)
Normalizer()
CAH_groupes(DF, scaler, ombre de clusters, Seuil_Outliers)¶
CAH_groupes(DF_F, Normalizer(), 5, 5) print('-----------------------------------------------------------------------------------------------------------------------')
Kmeans_Centroides(DF, scaler, ombre de clusters, Seuil_Outliers)¶
Kmeans_Centroides(DF_F, Normalizer(), 5, 5)
CAH_Stats(DF, scaler, Nombre de clusters)¶
Affichage et Enregistrement des résultats CAH¶
Data_Norm_CAH = CAH_Stats(DF_F, Normalizer(), 5) print('-----------------------------------------------------------------------------------------------------------------------')
Kmeans_Stats(DF, scaler, Nombre de clusters)¶
Affichage et enregistrement des résultats Kmeans¶
Data_Norm_Kmeans = Kmeans_Stats(DF_F, Normalizer(), 5)
Choix du DF pour l'ACP:¶
Data_Scaler_CAH Data_Log_CAH Data_MinMax_CAH Data_Power_CAH Data_Norm_CAH
Data_Scaler_Kmeans Data_Log_Kmeans Data_MinMax_Kmeans Data_Power_Kmeans Data_Norm_Kmeans
Le choix du prétraitement s'est porté sur la Transformation Logarithmique, complété par la méthode des K-means (Data_Log_Kmeans)¶
# Prise en compte du DF du prétraitement sélectionné
DF = Data_Log_Kmeans
# Séparation des Clusters du DF
Clusters = DF[['cluster']]
DF = DF.drop('cluster', axis=1)
# Split des données:
X = DF.values
names = DF.index
features = DF.columns
# Fit & transform
scaler = StandardScaler()
scaler.fit(X)
X_norm = scaler.transform(X)
# Réduction de dimensions avec PCA (utilisé pour la visualisation)
pca = PCA(n_components=5)
X_trans = pca.fit_transform(X)
# Transformer X_trans en np.array
X_ = np.array(X_trans)
# Aide au choix de n-components
pca = PCA().fit(X_norm)
scree = (pca.explained_variance_ratio_*100).round(2)
scree_cum = scree.cumsum().round()
Text_message('Cumul des valeurs propres sur X_norm : {}'.format(scree_cum))
Nombre de composantes principales à conserver lors de la réduction de dimensionnalité = 5
# PCA
n_components = 5
# Vérification moyennes à 0 et écarts type à 1 :
Text_message("Vérification moyennes à 0 et écarts type à 1")
idx = ["mean", "std"]
display(pd.DataFrame(X_norm).describe().round(2).loc[idx, :])
# On instancie notre ACP :
pca = PCA(n_components=n_components)
# On l'entraine sur les données scalées :
pca.fit(X_norm)
# Variable avec la liste de nos composantes :
x_list = range(1, n_components+1)
# Enregistrement dans une variable :
scree = (pca.explained_variance_ratio_*100).round(2)
scree_cum = scree.cumsum().round()
# Affichage des graphiques
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.bar(x_list, scree, color=plt.cm.Blues(scree / max(scree)))
plt.plot(x_list, scree_cum, c="firebrick", marker='o')
plt.xlabel("Rang de l'axe d'inertie")
plt.ylabel("Pourcentage d'inertie")
plt.title("Eboulis des valeurs propres", color='firebrick', fontsize=10, fontweight='bold')
plt.grid(color='gray', linestyle='--')
plt.subplot(1, 2, 2)
# PCA avec 10 components
pca1 = PCA(10).fit(X_norm)
# Calcul de la variance expliquée par composante
explained_variance = pca1.explained_variance_ratio_
# Création d'un graphique pour la méthode du coude
plt.plot(range(1, len(explained_variance) + 1), explained_variance, linestyle='-', c="firebrick", marker='o')
plt.xlabel('Nombre de composantes')
plt.ylabel('Variance expliquée')
plt.title('Variance expliquée par nombre de composantes\n Méthode du coude', color='firebrick', fontsize=10, fontweight='bold')
plt.grid(color='gray', linestyle='--')
# Ajustement des ticks de l'axe des abscisses
plt.xticks(np.arange(1, len(explained_variance) + 1, 1))
plt.show()
# Affichage n-component retenu :
Text_message('La méthode du coude nous indique que {} composantes suffisent'.format(n_components))
Text_message('Cumul des valeurs propres : {}'.format(scree_cum))
# DF des composantes principales
pcs = pca.components_
pcs = pd.DataFrame(pcs)
# Ajout des F :
pcs.columns = features
pcs.index = [f"F{i}" for i in x_list]
pcs.round(2)
Tmessage("Composantes principales")
display(pcs)
# Représentation graphique :
fig, ax = plt.subplots(figsize=(12, 3))
sns.heatmap(pcs.T, vmin=-1, vmax=1, annot=True, cmap="coolwarm", fmt="0.2f")
plt.title('Heatmap des composantes principales', color='firebrick', fontsize=14, fontweight='bold')
plt.show()
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| mean | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | -0.0 | 0.0 | 0.0 | -0.0 | -0.0 | -0.0 |
| std | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| F1 | -0.109035 | -0.347413 | -0.228116 | -0.150594 | 0.017506 | 0.086700 | 0.063953 | -0.403687 | -0.167296 | -0.259444 | -0.414301 | -0.349304 | -0.401131 | 0.260690 |
| F2 | -0.478619 | 0.041260 | -0.123821 | 0.319042 | -0.381293 | -0.479370 | -0.006275 | -0.019359 | -0.449257 | 0.236869 | 0.003311 | -0.111488 | 0.077628 | 0.010105 |
| F3 | 0.147892 | -0.018495 | 0.646400 | 0.537188 | -0.287121 | 0.137757 | -0.197125 | -0.034475 | 0.117500 | -0.116553 | -0.151646 | -0.200423 | -0.106706 | 0.167262 |
| F4 | 0.059849 | 0.057273 | 0.163323 | 0.125701 | -0.087583 | 0.054226 | 0.851345 | -0.133857 | -0.098531 | -0.178098 | 0.000760 | -0.032429 | 0.000386 | -0.393531 |
| F5 | -0.125363 | -0.426469 | -0.003080 | 0.114343 | -0.033146 | 0.151246 | 0.401138 | 0.180493 | 0.214739 | 0.451366 | 0.042006 | 0.241965 | -0.027796 | 0.510816 |
# Projection
X_proj = pca.transform(X_norm)
# correlation_graph(pca, x_y, features, palette="rocket", legend_fontsize=12, label_fontsize=10, Indicsize=8, arrow_alpha=0.8):
# Afficher le cercle de corrélation pour F1 et F2
x_y = 0,1
correlation_graph(pca, (x_y), features, palette="viridis")
# Plans_Factoriels(X_projected, x_y, clusters=None, alpha=1, figsize=[10,8], marker=".", palette='viridis')
Plans_Factoriels(X_proj, x_y, pca, clusters=Clusters['cluster'], figsize=(12,8), marker="o")
# Plans_Factoriels(X_projected, x_y, pca=None,labels=None, clusters=None,alpha=1, figsize=[10,8], marker=".", palette='viridis')
Plans_Factoriels(X_proj, x_y, pca, labels=names, clusters=Clusters['cluster'], palette='viridis', figsize=(20,16), marker="o")
#-----------------------------------------------------------------------------------------------------------------------
# Afficher le cercle de corrélation pour F3 et F4
x_y = 2,3
correlation_graph(pca, (x_y), features, palette="viridis")
Plans_Factoriels(X_proj, x_y, pca, clusters=Clusters['cluster'], figsize=(10,5), marker="o")
Plans_Factoriels(X_proj, x_y, pca, labels=names, figsize=(20,16), clusters=Clusters['cluster'],marker="o")
# --------------------------------------------- Choix du/des Clusters ----------------------------------
# Si 2 clusters intéressants:
#CHOIX0 = Data_Log_Kmeans.loc[Data_Log_Kmeans['cluster'] == 0]
#CHOIX1 = Data_Log_Kmeans.loc[Data_Log_Kmeans['cluster'] == 2]
#CHOIX = pd.concat([CHOIX0, CHOIX1], ignore_index=False)
# Sinon 1 seul cluster :
CHOIX = Data_Log_Kmeans.loc[Data_Log_Kmeans['cluster'] == 3]
CHOIX = CHOIX.drop('cluster', axis=1)
display(CHOIX.shape)
# --------------------------------------------- Calcul du score par pays ----------------------------------
CHOIX['Score'] = round((CHOIX['Dispo Alim']+0.1 + CHOIX['Dispo Alim (p/j)']*0.7+ CHOIX['Importation Qté']*1.5 + CHOIX['TDI']*2
+ CHOIX['TAS']*0.5 + CHOIX['%Croiss_Pop']*1.3 + CHOIX['PiB croiss.Hab %']*1.4 + CHOIX['%Prot_animale']*2 +
CHOIX['Stabilité politique']*0.4 + CHOIX['Pop(Million)']*0.1),2)
CHOIX = CHOIX.sort_values(by=['Score'], ascending=False)
CHOIX = CHOIX.reset_index()
# --------------------------------------------- DF Selection ----------------------------------------------
# Vérification concordance Pays et ajout du code iso_a3 pour merge avec 'world'
Pays_Etalon = pd.read_csv('PAYS_ETALON150.csv', sep=';')
Pays_Etalon = Pays_Etalon.rename(columns={'Country_FR': 'Pays','Alpha-3 code':'iso_a3'})
Concordance_pays = {"Pays-Bas (Royaume des)": 'Pays-Bas'}
Pays_Etalon['Pays'] = Pays_Etalon['Pays'].replace(Concordance_pays)
CodePays = Pays_Etalon[['Country','Pays','iso_a3']]
Pays_absents(CHOIX,CodePays)
CHOIXF = pd.merge(CHOIX, CodePays, on=['Pays'], how ='left')
CHOIXF= CHOIXF[['Pays', 'iso_a3', 'Score']]
Infos_Sup = DF_F.copy()
Infos_Sup = Infos_Sup.reset_index()
Infos_Sup = Infos_Sup[['Pays', 'Pop(Million)', 'Stabilité politique']]
CHOIXF = CHOIXF.merge(Infos_Sup, how='left', left_on='Pays', right_on='Pays')
CHOIX = CHOIXF.copy()
Text_message("Dataframe de sélection")
display(CHOIXF.head(3))
(45, 14)
| Pays | Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | Score | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Mexique | 15.669432 | 4.947695 | 7.041412 | 3.240637 | 4.338075 | 4.836959 | 1.366921 | 9.22485 | 14.053748 | 0.095310 | 3.822098 | 4.525044 | 0.398776 | 1.631199 | 43.80 |
| 1 | Japon | 15.091932 | 4.370081 | 7.038784 | 3.823629 | 4.514479 | 4.842545 | 1.122358 | 10.61471 | 15.449313 | 0.702947 | 3.912023 | 4.480740 | 0.444686 | 0.095310 | 42.06 |
[]
| Pays | iso_a3 | Score | Pop(Million) | Stabilité politique | |
|---|---|---|---|---|---|
| 0 | Mexique | MEX | 43.80 | 125.085311 | -0.843629 |
| 1 | Japon | JPN | 42.06 | 125.791677 | 1.019695 |
| 2 | Arabie saoudite | SAU | 41.78 | 35.827362 | -0.623456 |
Indicateurs filtres de sélection
Stabilite_mini = 0 # de -2 à 1.6
Score_mini = 10
Population_mini = 4 # en million
Selection = CHOIXF.copy()
# On conserve les pays avec un indice de stabilité politique > mini
Selection = Selection.loc[Selection['Stabilité politique'] >= Stabilite_mini]
# On conserve les pays avec un score > mini
Selection = Selection.loc[Selection['Score'] >= Score_mini]
# On conserve les pays avec une population totale > mini millions
Selection = Selection.loc[Selection['Pop(Million)'] >= Population_mini]
#Selection = Selection.reset_index()
CHOIXF= Selection.copy()
Tmessage("Liste des pays retenus pour l'étude de marché")
Selection = Selection.sort_values(by='Score', ascending=False)
Selection.set_index('Pays', inplace=True)
display(Selection.round(2))
# ------------------------------------------ Visualisation --------------------------------------
# Charger le fichier GeoJSON
geojson_url = 'https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json'
response = requests.get(geojson_url)
geojson_data = response.json()
# Fonction pour exclure un pays du GeoJSON
def filter_geojson(data, country_name_to_exclude):
filtered_features = [
feature for feature in data['features']
if feature['properties']['name'] != country_name_to_exclude
]
return {'type': 'FeatureCollection', 'features': filtered_features}
# Exclure l'Antarctique
geojson_data = filter_geojson(geojson_data, 'Antarctica')
# Reprise du DataFrame
df = Selection
# Convertir le DataFrame en dictionnaire pour un accès facile
data_dict = df.set_index('iso_a3').to_dict(orient='index')
# Mise à jour du GeoJSON pour inclure les informations supplémentaires
for feature in geojson_data['features']:
iso_a3 = feature['id']
if iso_a3 in data_dict:
feature['properties']['Score'] = data_dict[iso_a3]['Score']
feature['properties']['Stabilité_politique'] = data_dict[iso_a3]['Stabilité politique']
feature['properties']['Population_million'] = data_dict[iso_a3]['Pop(Million)']
else:
feature['properties']['Score'] = 'N/A'
feature['properties']['Stabilité_politique'] = 'N/A'
feature['properties']['Population_million'] = 'N/A'
# Créer une carte Folium
m = folium.Map(location=[30, 0], zoom_start=2, width='100%', height='500px')
# Définir les couleurs et les styles
highlight_color = 'viridis'
default_fill_color = 'lightgrey'
border_color = 'black'
border_weight = 1.2
# Fonction de style conditionnel
def style_function(feature):
iso_a3 = feature['id']
if iso_a3 in data_dict:
return {
'fillColor': highlight_color,
'color': border_color,
'weight': border_weight,
'fillOpacity': 0.0
}
else:
return {
'fillColor': 'white', # Couleur blanche pour les pays non sélectionnés
'color': border_color,
'weight': border_weight,
'fillOpacity': 0.9
}
# Ajouter un choropleth
folium.Choropleth(
geo_data=geojson_data,
data=df,
columns=['iso_a3', 'Score'],
key_on='feature.id',
fill_color=highlight_color,
fill_opacity=0.8,
line_opacity=0.8,
line_color=border_color,
line_weight=border_weight,
legend_name='Score par pays'
).add_to(m)
# Ajouter le GeoJson avec tooltips et styles conditionnels
folium.GeoJson(
geojson_data,
style_function=style_function,
tooltip=folium.GeoJsonTooltip(
fields=['name', 'Score', 'Stabilité_politique', 'Population_million'], # Champs mis à jour
aliases=['Country:', 'Score:', 'Stabilité politique:', 'Population (millions):'],
localize=True,
labels=True,
sticky=True
)
).add_to(m)
# Afficher la carte
sns.set(rc={'axes.facecolor':'white', 'figure.facecolor':'white'})
Tmessage('Carte du monde avec score par pays')
m
| iso_a3 | Score | Pop(Million) | Stabilité politique | |
|---|---|---|---|---|
| Pays | ||||
| Japon | JPN | 42.06 | 125.79 | 1.02 |
| Pays-Bas | NLD | 41.70 | 17.36 | 0.82 |
| Royaume-Uni | GBR | 41.16 | 66.78 | 0.53 |
| Allemagne | DEU | 40.73 | 83.15 | 0.55 |
| Émirats arabes unis | ARE | 39.93 | 9.21 | 0.67 |
| Belgique | BEL | 39.72 | 11.51 | 0.46 |
| Viet Nam | VNM | 39.15 | 95.78 | 0.04 |
| France | FRA | 39.09 | 64.40 | 0.27 |
| Irlande | IRL | 38.96 | 4.90 | 0.96 |
| Cuba | CUB | 38.53 | 11.32 | 0.61 |
| Danemark | DNK | 37.65 | 5.80 | 0.97 |
| Canada | CAN | 37.50 | 37.52 | 0.99 |
| États-Unis d'Amérique | USA | 37.06 | 334.32 | 0.12 |
| Roumanie | ROU | 36.62 | 19.52 | 0.54 |
| Espagne | ESP | 36.28 | 47.13 | 0.29 |
| Autriche | AUT | 36.27 | 8.88 | 0.89 |
| République de Corée | KOR | 36.12 | 51.80 | 0.55 |
| République Tchèque | CZE | 35.78 | 10.54 | 0.94 |
| Suède | SWE | 35.25 | 10.27 | 1.01 |
| Malaisie | MYS | 34.93 | 32.80 | 0.15 |
| Hongrie | HUN | 34.87 | 9.77 | 0.76 |
| Portugal | PRT | 34.07 | 10.29 | 1.05 |
| Pologne | POL | 34.03 | 38.49 | 0.55 |
| Suisse | CHE | 33.74 | 8.58 | 1.31 |
| Grèce | GRC | 33.22 | 10.57 | 0.16 |
| Italie | ITA | 32.58 | 59.73 | 0.38 |
| Australie | AUS | 29.33 | 25.36 | 0.92 |
Recommandations:¶
- Vérifier le niveau de coûts de production de volailles (Kg ou Tonne) par rapport à la France¶
- Vérifier auprès de la COFACE les informations économiques et sectorielles¶
- Les Pays ayant un score supérieur à 35 sont à privilégiér¶
- Pour les Pays musulmans -- Conformité/Certification produits Halal¶
- D'un point de vue écologique (Transport), privilégier les Pays Européens + Ireland¶
# Indicateurs présents dans la matrice de corrélation
Text_message('Indicateurs présents dans la matrice de corrélation')
display(DF_F.head(0))
# Préparation des indicateurs pour sélection finale
Text_message('Indicateurs non-prétraités pour sélection finale')
DF_Stab_Pop = DF_F[['Stabilité politique','Pop(Million)']]
display(DF_Stab_Pop.head(0))
# Choix des indicateurs non redondants:
Text_message("Indicateurs retenus pour l'analyse")
DF_Pro = DF_F[['Importation Qté', 'TDI', 'TAS', '%Croiss_Pop', 'PiB croiss.Hab %' ,'Moy_Prot' , '%Prot_animale']]
#DF_Pro = DF_F[['Dispo Alim (p/j)', 'TDI', 'TAS', '%Croiss_Pop', 'PiB croiss.Hab %' ,'Moy_Prot' , '%Prot_animale']]
DF_Pro.head(0)
| Dispo Alim | Dispo Alim (p/j) | Importation Qté | TDI | TAS | Pop(Million) | PiB croiss.Hab % | PIB Valeur Hab | PIB Valeur | Stabilité politique | Moy_Prot_Animale | Moy_Prot | %Prot_animale | %Croiss_Pop | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pays |
| Stabilité politique | Pop(Million) | |
|---|---|---|
| Pays |
| Importation Qté | TDI | TAS | %Croiss_Pop | PiB croiss.Hab % | Moy_Prot | %Prot_animale | |
|---|---|---|---|---|---|---|---|
| Pays |
Répartition des clusters suivant différents prétraitements. On cherche une répartition homogène qui minimise l'effet des outliers
# Boucle de prétraitement:
Tmessage("Observation de la ventilation des Pays avec 4 clusters")
pretraitements = [preprocessing.StandardScaler(), 'Log', MinMaxScaler(), PowerTransformer(method='yeo-johnson'), Normalizer()]
for i in pretraitements :
Clusterings(DF_Pro, i, 4)
J'opte pour K-means(Log) / + Homogène
Choix prétraitement :¶
- Methode = 'StandardScaler' : scaler = preprocessing.StandardScaler()
- Methode = 'Transformation logarithmique' : scaler = 'Log'
- Methode = 'MinMaxScaler' : scaler = MinMaxScaler()
- Methode = 'Power Transformation' : scaler = PowerTransformer(method='yeo-johnson')
- Methode = 'Normalizer' : scaler = Normalizer()
# Confirmation du nombre de Clusters à prendre en compte sur le prétraitement choisi
print('-----------------------------------------------------------------------------------------------------------------------')
Kmeans(DF_Pro, 'Log')
print('-----------------------------------------------------------------------------------------------------------------------')
Tmessage("Pour notre analyse, nous avons besoin d'au moins 4 clusters pour obtenir des groupes bien distincts")
Tmessage("Je choisis 5 clusters (score plus élevé que 4)")
Clusterings(DF_Pro, 'Log', 5)
print('-----------------------------------------------------------------------------------------------------------------------')
# Tendances des indicateurs et répartition des groupes
DF_Cib = Kmeans_Stats(DF_Pro, 'Log', 5)
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
| Importation Qté | TDI | TAS | %Croiss_Pop | PiB croiss.Hab % | Moy_Prot | %Prot_animale | cluster | |
|---|---|---|---|---|---|---|---|---|
| cluster | ||||||||
| 0 | 2.920083 | 2.184894 | 4.594186 | 1.082976 | 1.210264 | 4.401141 | 0.356079 | 0.0 |
| 1 | 2.812986 | 4.580810 | 1.046495 | 1.656277 | 0.777775 | 4.245898 | 0.380191 | 1.0 |
| 2 | 5.314704 | 3.716771 | 4.181430 | 1.234972 | 0.557141 | 4.513597 | 0.401605 | 2.0 |
| 3 | 2.702625 | 4.013002 | 3.765479 | 1.858609 | 0.747724 | 4.325423 | 0.348891 | 3.0 |
| 4 | 0.609947 | 0.397817 | 4.649195 | 2.034258 | 0.775077 | 4.308673 | 0.277133 | 4.0 |
| Importation Qté | TDI | TAS | %Croiss_Pop | PiB croiss.Hab % | Moy_Prot | %Prot_animale | cluster | |
|---|---|---|---|---|---|---|---|---|
| Pays | ||||||||
| Afghanistan | 3.806662 | 4.170843 | 3.727619 | 2.557227 | 0.095310 | 4.048301 | 0.165514 | 3 |
| Afrique du Sud | 6.192362 | 3.153163 | 4.435330 | 1.601406 | 0.095310 | 4.390739 | 0.371564 | 2 |
| Albanie | 3.135494 | 4.156693 | 3.641264 | 0.095310 | 1.004191 | 4.736198 | 0.425268 | 3 |
Index(['Barbade', 'Bosnie-Herzégovine', 'Bélarus', 'Costa Rica', 'El Salvador',
'Fidji', 'Finlande', 'Honduras', 'Jamaïque', 'Liban', 'Malaisie',
'Maurice', 'Nicaragua', 'Nigéria', 'Ouzbékistan', 'Panama', 'Pologne',
'Pérou', 'République arabe syrienne', 'République de Moldova',
'République dominicaine', 'République démocratique populaire lao',
'République-Unie de Tanzanie', 'Serbie', 'Soudan du Sud', 'Turquie',
'Ukraine', 'Uruguay', 'Venezuela (République bolivarienne du)',
'Égypte', 'États-Unis d'Amérique'],
dtype='object', name='Pays')
Index(['Antigua-et-Barbuda', 'Cabo Verde', 'Congo', 'Dominique', 'Gabon',
'Gambie', 'Haïti', 'Lesotho', 'Luxembourg', 'Macédoine du Nord',
'Micronésie (États fédérés de)', 'Mongolie', 'Nauru',
'Nouvelle-Calédonie', 'Oman', 'Polynésie française',
'République démocratique du Congo', 'Saint-Kitts-et-Nevis',
'Saint-Vincent-et-les Grenadines', 'Samoa', 'Timor-Leste',
'Îles Salomon'],
dtype='object', name='Pays')
Index(['Afrique du Sud', 'Allemagne', 'Angola', 'Arabie saoudite', 'Autriche',
'Belgique', 'Bulgarie', 'Bénin', 'Canada', 'Chili',
'Chine - RAS de Hong-Kong', 'Chine, Taiwan Province de',
'Chine, continentale', 'Colombie', 'Cuba', 'Danemark', 'Espagne',
'France', 'Fédération de Russie', 'Ghana', 'Grèce', 'Guatemala',
'Géorgie', 'Hongrie', 'Iraq', 'Irlande', 'Italie', 'Japon',
'Kazakhstan', 'Koweït', 'Lettonie', 'Libye', 'Lituanie', 'Mexique',
'Pays-Bas', 'Philippines', 'Portugal', 'Qatar', 'Roumanie',
'Royaume-Uni', 'République Tchèque', 'République de Corée', 'Slovaquie',
'Suède', 'Viet Nam', 'Yémen', 'Émirats arabes unis'],
dtype='object', name='Pays')
Index(['Afghanistan', 'Albanie', 'Arménie', 'Azerbaïdjan', 'Bahamas',
'Bahreïn', 'Bhoutan', 'Botswana', 'Chine - RAS de Macao', 'Chypre',
'Croatie', 'Estonie', 'Eswatini', 'Grenade', 'Guinée', 'Guinée-Bissau',
'Islande', 'Jordanie', 'Kirghizistan', 'Kiribati', 'Libéria', 'Malte',
'Mauritanie', 'Monténégro', 'Mozambique', 'Namibie', 'Niger',
'Papouasie-Nouvelle-Guinée', 'République centrafricaine',
'Sainte-Lucie', 'Sao Tomé-et-Principe', 'Seychelles', 'Sierra Leone',
'Slovénie', 'Suisse', 'Suriname', 'Tadjikistan', 'Tchad', 'Togo',
'Trinité-et-Tobago', 'Turkménistan', 'Vanuatu', 'Zambie'],
dtype='object', name='Pays')
Index(['Algérie', 'Argentine', 'Australie', 'Bangladesh', 'Belize',
'Bolivie (État plurinational de)', 'Brésil', 'Burkina Faso', 'Burundi',
'Cambodge', 'Cameroun', 'Comores', 'Côte d'Ivoire', 'Guyana', 'Inde',
'Indonésie', 'Iran (République islamique d')', 'Israël', 'Kenya',
'Madagascar', 'Malawi', 'Mali', 'Maroc', 'Myanmar', 'Norvège',
'Nouvelle-Zélande', 'Népal', 'Ouganda', 'Pakistan', 'Paraguay',
'Rwanda', 'Soudan', 'Sri Lanka', 'Sénégal', 'Thaïlande', 'Tunisie',
'Zimbabwe', 'Équateur', 'Éthiopie'],
dtype='object', name='Pays')
# Séparation des données et des clusters
Clusters = DF_Cib[['cluster']]
DF_Cible = DF_Cib.drop('cluster', axis=1)
# Split de la table (Données, index/pays, nom colonnes):
X = DF_Cible.values
names = DF_Cible.index
features = DF_Cible.columns
# Prétraitement des données:
scaler = StandardScaler()
# On fit :
scaler.fit(X)
# On transforme :
X_scaled = scaler.transform(X)
# Vérification moyennes à 0 et écarts type à 1 :
idx = ["mean", "std"]
pd.DataFrame(X_scaled).describe().round(2).loc[idx, :]
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|---|
| mean | 0.0 | 0.0 | 0.0 | -0.0 | 0.0 | -0.0 | -0.0 |
| std | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
# Vérification moyennes à 0 et écarts type à 1 :
idx = ["mean", "std"]
pd.DataFrame(X_scaled).describe().round(2).loc[idx, :]
# PCA
n_components = 4
# On instancie notre ACP :
pca = PCA(n_components=n_components)
# On l'entraine sur les données scalées :
pca.fit(X_scaled)
# Enregistrement dans une variable :
scree = (pca.explained_variance_ratio_*100).round(2)
scree_cum = scree.cumsum().round()
# Variable avec la liste de nos composantes :
x_list = range(1, n_components+1)
# Affichage des graphiques avec subplot
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.bar(x_list, scree, color=plt.cm.Blues(scree / max(scree)))
plt.plot(x_list, scree_cum, c="firebrick", marker='o')
plt.xlabel("Rang de l'axe d'inertie")
plt.ylabel("Pourcentage d'inertie")
plt.title("Eboulis des valeurs propres", color='firebrick', fontsize=12, fontweight='bold')
plt.grid(color='gray', linestyle='--')
plt.subplot(1, 2, 2)
# PCA avec 10 components
pca1 = PCA(10).fit(X_norm)
# Calcul de la variance expliquée par composante
explained_variance = pca1.explained_variance_ratio_
# Création d'un graphique pour la méthode du coude
plt.plot(range(1, len(explained_variance) + 1), explained_variance, linestyle='-', c="firebrick", marker='o')
plt.xlabel('Nombre de composantes')
plt.ylabel('Variance expliquée')
plt.title('Variance expliquée par nombre de composantes\n Méthode du coude', color='firebrick', fontsize=10, fontweight='bold')
plt.grid(color='gray', linestyle='--')
# Ajustement des ticks de l'axe des abscisses
plt.xticks(np.arange(1, len(explained_variance) + 1, 1))
plt.show()
# Affichage n-component retenu :
Text_message('La méthode du coude nous indique que {} composantes suffisent'.format(n_components))
Text_message('Cumul des valeurs propres : {}'.format(scree_cum))
pcs = pca.components_
pcs = pd.DataFrame(pcs)
# Ajout des F :
pcs.columns = features
pcs.index = [f"F{i}" for i in x_list]
pcs.round(2)
pcs.T
# Représentation graphique :
fig, ax = plt.subplots(figsize=(16, 4))
sns.heatmap(pcs.T, vmin=-1, vmax=1, annot=True, cmap="coolwarm", fmt="0.2f")
plt.title("Heatmap des composantes principales", color='firebrick', fontsize=16, fontweight='bold')
plt.show()
# Projection
X_proj = pca.transform(X_scaled)
X_ = np.array(X_proj)
# Afficher le cercle de corrélation pour F1 et F2
x_y = 0,1
correlation_graph(pca, (x_y), features, palette="rocket", legend_fontsize=10, label_fontsize=9)
# Afficher la projection factorielle :
Plans_Factoriels(X_proj, x_y, clusters=Clusters['cluster'], figsize=(12,4), marker="o")
# Afficher les pays avec F1 et F2 :
Plans_Factoriels(X_proj, x_y, pca, labels=names, figsize=(18,14), clusters=Clusters['cluster'], marker="o")
# Afficher le cercle de corrélation pour F3 et F4
x_y = 2,3
correlation_graph(pca, (x_y), features, palette="rocket", legend_fontsize=10, label_fontsize=9)
# Afficher la projection factorielle :
Plans_Factoriels(X_proj, x_y, clusters=Clusters['cluster'], figsize=(12,4), marker="o")
# Afficher les pays avec F2 et F3 :
Plans_Factoriels(X_proj, x_y, pca, labels=names, figsize=(18,14), clusters=Clusters['cluster'],marker="o")
# --------------------------------------------- Choix du/des Clusters ----------------------------------
# Si 2 clusters intéressants:
#CHOIX0 = DF_Pro_Kmeans.loc[DF_Pro_Kmeans['cluster'] == ]
#CHOIX1 = DF_Pro_Kmeans.loc[DF_Pro_Kmeans['cluster'] == ]
#CHOIX = pd.concat([CHOIX0, CHOIX1], ignore_index=False)
# Sinon 1 seul cluster :
CHOIX = DF_Cib.loc[DF_Cib['cluster'] == 2]
CHOIX = DF_Cib.loc[DF_Cib['cluster'] == 2]
# On définie les Seuils de sélection:
Indice_Stabilite_Politique_Min = -0.0
Population_Min_enMillions = 4
Score_Mini = 10
# -------------------------------- Calcul du score -------------------------
#CHOIX['Score'] = (CHOIX['Dispo Alim (p/j)'] + CHOIX['Dispo Alim (p/j)']*1.5 + CHOIX['TDI']*2 + CHOIX['TAS']*0.5 +
# CHOIX['%Croiss_Pop']*1.5 + CHOIX['PiB croiss.Hab %'] + CHOIX['%Prot_animale']*2)
CHOIX['Score'] = (CHOIX['Importation Qté']*1.5 + CHOIX['TDI']*2 + CHOIX['TAS'] + CHOIX['%Croiss_Pop']*1.5 +
CHOIX['PiB croiss.Hab %']*2 + CHOIX['%Prot_animale']*2)
CHOIX = CHOIX.sort_values(by=['Score'], ascending=False)
# --------------------------------- Ajout d'indicateurs de sélection ---------------
DF_StabPol = DF_F[['Pop(Million)', 'Stabilité politique']]
DF_StabPol = DF_StabPol.reset_index()
CHOIX = pd.merge(CHOIX, DF_StabPol, on='Pays', how='left')
# --------------------------------- Critères de sélection ---------------
# Suppression des Pays où l'indice de stabilité politique est inférieure au seuil
CHOIX = CHOIX.sort_values(by=['Stabilité politique'], ascending=False)
CHOIX = CHOIX.loc[CHOIX['Stabilité politique'] >= Indice_Stabilite_Politique_Min]
# Suppression des Pays où la population totale est inférieure au seuil en millions
CHOIX = CHOIX.loc[CHOIX['Pop(Million)'] >= Population_Min_enMillions]
# Sélection des pays ayant un score supérieur à Score_Mini
CHOIX = CHOIX.loc[CHOIX['Score'] >= Score_Mini]
# Ajout du code iso_a3
Pays_Etalon = pd.read_csv('PAYS_ETALON150.csv', sep=';')
Pays_Etalon = Pays_Etalon.rename(columns={'Country_FR': 'Pays','Alpha-3 code':'iso_a3'})
Concordance_pays = {"Pays-Bas (Royaume des)": 'Pays-Bas'}
Pays_Etalon['Pays'] = Pays_Etalon['Pays'].replace(Concordance_pays)
CodePays = Pays_Etalon[['Country','Pays','iso_a3']]
CHOIX = pd.merge(CHOIX, CodePays, on=['Pays'], how ='left')
# --------------------------------- Sélection des Pays ---------------
Selection_Pays = CHOIX[['Pays', 'iso_a3', 'Score', 'Stabilité politique', 'Pop(Million)']]
Selection_Pays = Selection_Pays.sort_values(by='Score', ascending=False)
Selection_Pays.set_index('Pays', inplace=True)
# Affichage:
Tmessage("Pays sélectionnés pour l'étude de marché")
display(Selection_Pays.round(2))
# Charger le fichier GeoJSON
geojson_url = 'https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json'
response = requests.get(geojson_url)
geojson_data = response.json()
# Fonction pour exclure un pays du GeoJSON
def filter_geojson(data, country_name_to_exclude):
filtered_features = [
feature for feature in data['features']
if feature['properties']['name'] != country_name_to_exclude
]
return {'type': 'FeatureCollection', 'features': filtered_features}
# Exclure l'Antarctique
geojson_data = filter_geojson(geojson_data, 'Antarctica')
# Reprise du DataFrame
df = Selection_Pays
# Convertir le DataFrame en dictionnaire pour un accès facile
data_dict = df.set_index('iso_a3').to_dict(orient='index')
# Mise à jour du GeoJSON pour inclure les informations supplémentaires
for feature in geojson_data['features']:
iso_a3 = feature['id']
if iso_a3 in data_dict:
feature['properties']['Score'] = data_dict[iso_a3]['Score']
feature['properties']['Stabilité_politique'] = data_dict[iso_a3]['Stabilité politique']
feature['properties']['Population_million'] = data_dict[iso_a3]['Pop(Million)']
else:
feature['properties']['Score'] = 'N/A'
feature['properties']['Stabilité_politique'] = 'N/A'
feature['properties']['Population_million'] = 'N/A'
# Créer une carte Folium
m = folium.Map(location=[30, 0], zoom_start=2, width='100%', height='500px')
# Définir les couleurs et les styles
highlight_color = 'viridis'
default_fill_color = 'lightgrey'
border_color = 'black'
border_weight = 1.2
# Fonction de style conditionnel
def style_function(feature):
iso_a3 = feature['id']
if iso_a3 in data_dict:
return {
'fillColor': highlight_color,
'color': border_color,
'weight': border_weight,
'fillOpacity': 0.0
}
else:
return {
'fillColor': 'white', # Couleur blanche pour les pays non sélectionnés
'color': border_color,
'weight': border_weight,
'fillOpacity': 0.9
}
# Ajouter un choropleth
folium.Choropleth(
geo_data=geojson_data,
data=df,
columns=['iso_a3', 'Score'],
key_on='feature.id',
fill_color=highlight_color,
fill_opacity=0.8,
line_opacity=0.8,
line_color=border_color,
line_weight=border_weight,
legend_name='Score par pays'
).add_to(m)
# Ajouter le GeoJson avec tooltips et styles conditionnels
folium.GeoJson(
geojson_data,
style_function=style_function,
tooltip=folium.GeoJsonTooltip(
fields=['name', 'Score', 'Stabilité_politique', 'Population_million'], # Champs mis à jour
aliases=['Country:', 'Score:', 'Stabilité politique:', 'Population (millions):'],
localize=True,
labels=True,
sticky=True
)
).add_to(m)
# Afficher la carte
sns.set(rc={'axes.facecolor':'white', 'figure.facecolor':'white'})
Tmessage('Carte du monde avec score par pays')
m
| iso_a3 | Score | Stabilité politique | Pop(Million) | |
|---|---|---|---|---|
| Pays | ||||
| Pays-Bas | NLD | 30.70 | 0.82 | 17.36 |
| Belgique | BEL | 27.36 | 0.46 | 11.51 |
| Chine, Taiwan Province de | TWN | 26.14 | 0.79 | 23.78 |
| Japon | JPN | 26.00 | 1.02 | 125.79 |
| Irlande | IRL | 25.72 | 0.96 | 4.90 |
| Allemagne | DEU | 25.14 | 0.55 | 83.15 |
| Viet Nam | VNM | 25.02 | 0.04 | 95.78 |
| Koweït | KWT | 24.61 | 0.18 | 4.44 |
| Royaume-Uni | GBR | 24.56 | 0.53 | 66.78 |
| Émirats arabes unis | ARE | 24.34 | 0.67 | 9.21 |
| Bulgarie | BGR | 24.28 | 0.56 | 7.05 |
| Danemark | DNK | 24.22 | 0.97 | 5.80 |
| Cuba | CUB | 23.82 | 0.61 | 11.32 |
| Ghana | GHA | 23.62 | 0.12 | 31.52 |
| Autriche | AUT | 23.21 | 0.89 | 8.88 |
| France | FRA | 23.04 | 0.27 | 64.40 |
| Roumanie | ROU | 22.77 | 0.54 | 19.52 |
| République Tchèque | CZE | 21.90 | 0.94 | 10.54 |
| Suède | SWE | 21.88 | 1.01 | 10.27 |
| Slovaquie | SVK | 21.85 | 0.67 | 5.45 |
| Canada | CAN | 21.41 | 0.99 | 37.52 |
| Hongrie | HUN | 21.39 | 0.76 | 9.77 |
| République de Corée | KOR | 20.59 | 0.55 | 51.80 |
| Espagne | ESP | 20.32 | 0.29 | 47.13 |
| Portugal | PRT | 19.52 | 1.05 | 10.29 |
| Grèce | GRC | 19.09 | 0.16 | 10.57 |
| Italie | ITA | 17.12 | 0.38 | 59.73 |
Recommandations:¶
- Vérifier le niveau de coûts de production de volailles (Kg ou Tonne) par rapport à la France¶
- Vérifier auprès de la COFACE les informations économiques et sectorielles¶
- Les Pays ayant un score supérieur à 24 sont à privilégiér (Allemagne, Belgique, Irelande, Pays-Bas, UK - Japon, Taïwan et Viet Nam)¶
- D'un point de vue écologique (Transport), privilégier les Pays Européens + UK¶
Vérification des résultats par une étude existante